﻿#ifndef WRWORKTCPCOMMSERVICE_H
#define WRWORKTCPCOMMSERVICE_H

#include "WRWorkService.h"
#include "../WRSoft-Utility/Structs/WRArray.h"
#include "../WRSoft-Utility/Structs/WRDateTime.h"
#include <QMutex>
#include <QThread>

//工作TCP通讯服务类标识。 {A1E0AA51-9142-4EE2-B35B-49BB7E3EB51E}
#define WRWorkTcpCommServiceClass QUuid(0xa1e0aa51, 0x9142, 0x4ee2, 0xb3, 0x5b, 0x49, 0xbb, 0x7e, 0x3e, 0xb5, 0x1e)
//工作TCP通讯服务字符数组 WRWorkFileConfigProvider
#define WRWorkTcpCommServiceStrArr  {'W', 'R', 'W', 'o', 'r', 'k', 'T', 'c', 'p', 'C', 'o', 'm', 'm', 'S', 'e', 'r', 'v', 'i', 'c', 'e'}
//工作TCP通讯服务字符个数
#define WRWorkTcpCommServiceStrLen  20

//声明工作TCP通讯服务器。
class WRWorkTcpCommServer;
//声明工作TCP通讯服务器对象引用。
class WRWorkTcpCommServerObjRef;

//表示工作TCP通讯服务。
class WRWorkTcpCommService : public WRWorkService
{
private:
    //服务端口。
    WR16u m_port;
    //是否自启。
    bool m_autostart;
    //线程同步。
    QMutex m_mutex;
    //线程对象。
    QThread *m_thread;
    //服务对象。
    WRWorkTcpCommServer* m_server;
    //时间戳。
    WRDateTime m_timestamp;
    //对象集合。
    WRArray<WRWorkTcpCommServerObjRef*> m_objects;

    //执行初始化处理。
    void onInit(QList<WRWorkTcpCommServerObjRef*>& list, WRWorkObject* value, WRWorkTcpCommServerObjRef* parent = nullptr);

protected:
    //当加载后执行相应的初始工作。
    virtual void onInit(void) override;
    //当删除前执行相应的清理工作。
    virtual void onFree(void) override;

public:
    //初始化工作TCP通讯服务。
    WRWorkTcpCommService(const WRWorkInformation& info, WRWorkDaemon* daemon, WR16u port, bool autostart = true);
    //释放当前对象所占用的相关资源。
    ~WRWorkTcpCommService(void);

    //获取服务端口。
    inline WR16u port(void) const
    {
        return m_port;
    }

    //获取时间戳。
    inline WRDateTime timestamp(void) const
    {
        return m_timestamp;
    }
    //获取对象集合。
    inline const WRArray<WRWorkTcpCommServerObjRef*>& objects(void) const
    {
        return m_objects;
    }

    //获取当前工作设备类型。
    WRType* type(void) const;

    //启动服务，如果成功，则返回0。
    WR32s start(void);
    //停止服务。
    void stop(void);
};

#endif // WRWORKTCPCOMMSERVICE_H
